const PubSub = {
    // 订阅唯一ID
    id: 0,
    // 订阅列表
    callbacks: {

    },
}

// 订阅频道
PubSub.subscribe = function (channel, callback) {

    // 创建唯一编号
    const token = "token_" + this.id++;

    // 如果callbacks中存在该频道
    if (this.callbacks[channel]) {
        // 将回调添加到该频道中
        this.callbacks[channel][token] = callback;
    } else {
        // 如果不存在该频道，则创建该频道
        this.callbacks[channel] = {
            [token]: callback
        }
    }

    // 返回唯一编号
    return token;
}

// 发布消息
PubSub.publish = function (channel, data) {
    // 获取当前频道中所有的回调
    const callbacks = this.callbacks[channel];
    if (callbacks) {
       Object.values(callbacks).forEach(callback => callback(data));
    }
}

// 取消订阅
/**
 * 1. 如果没有传入token，则取消该频道下的所有订阅
 * 2. 如果传入token，则取消该频道下的指定订阅
 */
PubSub.unsubscribe = function (flag) {
    if(typeof flag === 'string') {
        // 如果传入token，则取消该频道下的指定订阅
        if(flag.indexOf('token_') === 0) {
            // 如果是 表明是一个订阅id
            Object.values(this.callbacks).find(obj => obj.hasOwnProperty(flag)) && delete this.callbacks[flag];
        } else {
            // 如果不是 表明是一个频道
            delete this.callbacks[flag]
        }
    } else {
        this.callbacks = {};
    }
}